/*
 * @Author: 吴让坤
 * @Date: 2023-12-23 14:23:17
 * @LastEditTime: 2023-12-23 16:50:07
 * @Description: 计算方法
 */
/**
 * 计算两个经纬度之间的距离
 */
export function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number) {
  const radius = 6371 * 1000 // 地球半径（单位：米）

  // 将经纬度转换为弧度
  const latRad1 = toRadians(lat1)
  const lonRad1 = toRadians(lon1)
  const latRad2 = toRadians(lat2)
  const lonRad2 = toRadians(lon2)

  // 使用Haversine公式计算距离
  const dlon = lonRad2 - lonRad1
  const dlat = latRad2 - latRad1
  const a
    = Math.sin(dlat / 2) ** 2
    + Math.cos(latRad1) * Math.cos(latRad2) * Math.sin(dlon / 2) ** 2
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
  const distance = radius * c

  return distance
}

export function toRadians(degrees: number) {
  return degrees * (Math.PI / 180)
}

/**
 * 加法函数 处理精度问题
 */
export function add(...args: number[]): number {
  return args.reduce((acc, cur) => {
    const result = Number.parseFloat(`${acc}`) + Number.parseFloat(`${cur}`);
    return Number.parseFloat(`${result}`);
  }, 0);
}

/**
 * 减法函数 处理精度问题
 */
export function subtract(...args: number[]): number {
  return args.reduce((acc, cur) => {
    const result = Number.parseFloat(`${acc}`) - Number.parseFloat(`${cur}`);
    return Number.parseFloat(`${result}`);
  }, 0);
}

/**
 * 乘法函数 处理精度问题
 */
export function multiply(...args: number[]): number {
  return args.reduce((acc, cur) => {
    const result = Number.parseFloat(`${acc}`) * Number.parseFloat(`${cur}`);
    return Number.parseFloat(`${result}`);
  }, 1);
}
